home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Information / CSMP Digest / volume 3 / csmp-digest-v3-148 < prev   
Text File  |  1996-06-10  |  34KB  |  978 lines

  1. C.S.M.P. Digest             Sun, 02 Jun 96       Volume 3 : Issue 148
  2.  
  3. Today's Topics:
  4.  
  5.         Alt.Sources.Mac Archive Updated...
  6.         EventAvail alternatives wanted
  7.         Finding Apps In Desktop DB?
  8.         Finding the caller of a CFM sharedlib?
  9.         If you don't want to *wait* for events...
  10.         MacFS: A Portable Macintosh Filesystem
  11.         Serial port in use?
  12.         Tiny Object Framework anyone?
  13.         Web page for Macsbug tips
  14.         [SOURCE] MicroMovie (was: HELP! with QuickTime)
  15.  
  16.  
  17.  
  18. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  19. (pottier@clipper.ens.fr).
  20.  
  21. The digest is a collection of article threads from the internet
  22. newsgroups comp.sys.mac.programmer.help, csmp.tools, csmp.misc and
  23. csmp.games. It is designed for people who read news semi-regularly and
  24. want an archive of the discussions.  If you don't know what a
  25. newsgroup is, you probably don't have access to it. Ask your systems
  26. administrator(s) for details. If you don't have access to news, you
  27. may still be able to post messages to the group by using a mail server
  28. like anon.penet.fi (mail help@anon.penet.fi for more information).
  29.  
  30. Each issue of the digest contains one or more sets of articles (called
  31. threads), with each set corresponding to a 'discussion' of a particular
  32. subject.  The articles are not edited; all articles included in this digest
  33. are in their original posted form (as received by our news server at
  34. nef.ens.fr).  Article threads are not added to the digest until the last
  35. article added to the thread is at least two weeks old (this is to ensure that
  36. the thread is dead before adding it to the digest).  Article threads that
  37. consist of only one message are generally not included in the digest.
  38.  
  39. The digests can be obtained by email, ftp or through the World Wide Web.
  40.  
  41. If you want to receive the digest by mail, send email to listserv@ens.fr
  42. with no subject and one of the following commands as body:
  43.     help                        Sends you a summary of commands
  44.     subscribe csmp-digest Your Name    Adds you to the mailing list
  45.     signoff csmp-digest            Removes you from the list
  46. Once you have subscribed, you will automatically receive each new
  47. issue as it is created.
  48.  
  49. Back issues are available by ftp from Info-Mac mirror sites in the
  50. per/csmp subdirectory, e.g.
  51.  
  52.   ftp://sumex-aim.stanford.edu/info-mac/per/csmp/
  53.  
  54. The contents of all back issues can be searched by accessing the
  55. following URL, courtesy of Andrew Barry (ajbarry@ozemail.com.au):
  56.  
  57.     http://marvin.stattech.com.au/search.html
  58.  
  59. -------------------------------------------------------
  60.  
  61. >From dnebing@epix.net
  62. Subject: Alt.Sources.Mac Archive Updated...
  63. Date: 16 May 1996 16:21:38 -0700
  64. Organization: Alt.Sources.Mac Archive
  65.  
  66. I have recently finished updating a good portion of the alt.sources.mac
  67. archive.  Stop by for a visit and see what's new...
  68.  
  69.   <ftp://ftp.ambrosiasw.com/pub/alt.sources.mac/>
  70.   <http://www.ambrosiasw.com/alt.sources.mac/>
  71.  
  72. Dave Nebinger
  73. *The* Alt.Sources.Mac Archivist
  74.  
  75. ---------------------------
  76.  
  77. >From andre.horstmann@unifr.ch (Andre Horstmann)
  78. Subject: EventAvail alternatives wanted
  79. Date: Wed, 08 May 1996 21:28:19 +0200
  80. Organization: University of Fribourg, Switzerland
  81.  
  82.  
  83. I need fast alternatives to the toolcall EventAvail. Up to now I used the
  84. (documented) global variable EventQueue (0x014A) to see whether the queue
  85. is empty (which then means: no events available).
  86.  
  87. Unfortunately an empty queue does not hold information about the mouse
  88. position and the modifiers, as EventAvail would do! Is there any way (e.g.
  89. global variables) to check for these.
  90.  
  91. Thanks for your help.
  92.  
  93. Andre
  94.  
  95. -- 
  96. mailto:andre.horstmann@unifr.ch - http://www.swix.ch/clan/shadow/ (11.4.96)
  97.  
  98. The worst about computers: they never admit being responsible for an error.
  99.  
  100.               *** Fast Eddie Laboratories, Switzerland ***
  101.  
  102. +++++++++++++++++++++++++++
  103.  
  104. >From awiner@oracle.com (Adam Winer)
  105. Date: Wed, 08 May 1996 19:45:29 -0700
  106. Organization: Oracle Corporation
  107.  
  108. In article <andre.horstmann-0805962128190001@news.swix.ch>,
  109. andre.horstmann@unifr.ch (Andre Horstmann) wrote:
  110.  
  111. > I need fast alternatives to the toolcall EventAvail. Up to now I used the
  112. > (documented) global variable EventQueue (0x014A) to see whether the queue
  113. > is empty (which then means: no events available).
  114. > Unfortunately an empty queue does not hold information about the mouse
  115. > position and the modifiers, as EventAvail would do! Is there any way (e.g.
  116. > global variables) to check for these.
  117.  
  118. OSEventAvail() is much faster than EventAvail() (it doesn't
  119. give any time to background processes).  A simple call of
  120. OSEventAvail(0, &event) should give you what you want.
  121.  
  122. -- Adam Winer
  123. awiner@us.oracle.com
  124.  
  125. ---------------------------
  126.  
  127. >From sjohnson@macromedia.com (Steven Johnson)
  128. Subject: Finding Apps In Desktop DB?
  129. Date: Thu, 09 May 1996 14:43:45 -0500
  130. Organization: Macromedia
  131.  
  132. If I have a file and and want to find the app(s) with the same creator,
  133. it's pretty easy (just call PBDTGetAppl).
  134.  
  135. However, let's say I have a file with a bogus creator (e.g., ????) but a
  136. good filetype (e.g., PICT), and I want to find all the apps that claim to
  137. be able to open that filetype. 
  138.  
  139. Is there any good way of doing this, sort of a brute-force disk search?
  140.  
  141. It appears that there isn't the inverse of PBDTGetAPPL, i.e.,
  142. PBDTGetAppsThatCanOpenThisFileType(). 
  143.  
  144. Nor is there a PBDT call to index thru the applications (so that I could
  145. then use other PBDT calls to see what filetypes they support).
  146.  
  147. There's obviously *some* way to get at this info, since both the Finder
  148. and the  Translation Mgr do this. But I can't find it documented anywhere.
  149.  
  150.  
  151. Anyone responding, I'd appreciate you e-mailing a copy as well as a public
  152. posting. Thanks!
  153.  
  154. -- 
  155. Steven Johnson               |  
  156. Senior Engineer              |  "Power lines have floaters
  157. Macromedia                   |   so the airplanes won't get snagged."
  158. sjohnson@macromedia.com      |
  159.  
  160. +++++++++++++++++++++++++++
  161.  
  162. >From aznemeng@godzilla.zeta.org.au (Andrew Nemeth)
  163. Date: 12 May 1996 20:49:50 GMT
  164. Organization: Kralizec Dialup Unix
  165.  
  166. Steven Johnson (sjohnson@macromedia.com) wrote:
  167. : If I have a file and and want to find the app(s) with the same creator,
  168. : it's pretty easy (just call PBDTGetAppl).
  169. :  
  170. : However, let's say I have a file with a bogus creator (e.g., ????) but a
  171. : good filetype (e.g., PICT), and I want to find all the apps that claim to
  172. : be able to open that filetype. 
  173.  
  174. : Is there any good way of doing this, sort of a brute-force disk search?
  175.  
  176. Have a look at my 'AppLauncher' C++ code (especially the
  177. 'TLaunch' class) to see how I search both the desktop
  178. database and the file catalogue for files.
  179.  
  180. The code is available from:
  181. o  CW8 Reference CD
  182. o  Celestin Apprentice IV CD
  183. o  Info-mac dev/src
  184. o  My WWW page
  185.  
  186. Andrew N.
  187.  
  188. Quicktime VR photography & services
  189. C++ & Java programming
  190.  http://www.zeta.org.au/~aznemeng/ 
  191.  
  192.  
  193. +++++++++++++++++++++++++++
  194.  
  195. >From jumplong@aol.com (Jump Long)
  196. Date: 12 May 1996 18:33:54 -0400
  197. Organization: America Online, Inc. (1-800-827-6364)
  198.  
  199. Steven Johnson wrote:
  200. >If I have a file and and want to find the app(s) with the same
  201. >creator, it's pretty easy (just call PBDTGetAppl).
  202. >  However, let's say I have a file with a bogus creator (e.g.,
  203. >????) but a good filetype (e.g., PICT), and I want to find all
  204. >the apps that claim to be able to open that filetype. 
  205. >
  206. >Is there any good way of doing this, sort of a brute-force disk
  207. >search?
  208. >  It appears that there isn't the inverse of PBDTGetAPPL, i.e.,
  209. >PBDTGetAppsThatCanOpenThisFileType(). 
  210. >
  211. >Nor is there a PBDT call to index thru the applications (so that
  212. >I could then use other PBDT calls to see what filetypes they
  213. >support).
  214. >  There's obviously *some* way to get at this info, since both
  215. >the Finder and the  Translation Mgr do this. But I can't find it
  216. >documented anywhere.
  217. >
  218. >
  219. >Anyone responding, I'd appreciate you e-mailing a copy as well
  220. >as a public posting. Thanks!
  221.  
  222. I've never messed with the Translation Manager, but I have worked with
  223. Desktop Manager and File Manager a lot, so I figured I'd give this a
  224. crack.
  225.  
  226. It looks like the Translation Manager gives you a way to find out what
  227. file types a specified application can open - the
  228. GetFileTypesThatAppCanNdoesn't seem to be the inverse of that call - a
  229. function that given a target file, returns a list of applications that say
  230. they can open that file. If you're just wanting to open a specific file,
  231. the easiest thing to do would be to tell the Finder to open the file with
  232. an Apple Event. If the file's creator application isn't available and the
  233. Translation Manager is available, the user will be presented the
  234. "translation choices" dialog box where they can pick another application
  235. that says it can open that file type.
  236.  
  237. However, if you really want to build the list yourself, I just wrote the
  238. code to build a list of applications that say they can open the target
  239. file. I've pasted the code for "GetAppsThatCanOpenDocNatively" into the
  240. next message. GetAppsThatCanOpenDocNatively isn't really fast because it
  241. calls GetFileTypesThatAppCanNativelyOpen once for each application
  242. ('APPL') it finds on all volumes.
  243.  
  244. By the way, the code uses a routine from MoreFiles. If you don't have
  245. MoreFiles, here's its URL:
  246. <ftp://members.aol.com/JumpLong/MoreFiles_1.4.2.sea.hqx> If you find a bug
  247. in GetAppsThatCanOpenDocNatively, let me know so I can correct my copy of
  248. it.
  249.  
  250. - Jim Luther
  251.  
  252. jumplong@aol.com
  253. <http://members.aol.com/JumpLong/>
  254.  
  255.  
  256. +++++++++++++++++++++++++++
  257.  
  258. >From jumplong@aol.com (Jump Long)
  259. Date: 12 May 1996 18:33:57 -0400
  260. Organization: America Online, Inc. (1-800-827-6364)
  261.  
  262. Here's the code for GetAppsThatCanOpenDocNatively.
  263.  
  264. - Jim Luther
  265.  
  266. jumplong@aol.com
  267. <http://members.aol.com/JumpLong/>
  268.  
  269. - --------
  270.  
  271. #include <Files.h>
  272. #include <Translation.h>
  273. #include "MoreFilesExtras.h"
  274.  
  275. /* handle to array of FSSpecs */
  276. typedef FSSpecHandle FSSpecArrayHandle;
  277.  
  278. pascal OSErr GetAppsThatCanOpenDocNatively(const FSSpec *targetDocument,
  279. FSSpecArrayHandle *appList, unsigned long *count)
  280. {
  281.  enum
  282.  {
  283.   kIgnoreCreator = 0x00000000,
  284.   kAPPLFileType = 'APPL',
  285.   kMaxSpecs  = 10
  286.  };
  287.  
  288.  OSErr result, memMgrErr;
  289.  FInfo fndrInfo;
  290.  OSType targetFileType;  /* file type of the target file */
  291.  HParamBlockRec pb;
  292.  short volIndex;  /* for indexing through the list of mounted volumes */
  293.  Boolean volDone;  /* flag that indicates when we should stop looking for
  294. new volumes */
  295.  FSSpec specs[kMaxSpecs]; /* an array for getting application FSSpecs */
  296.  long actMatchCount;  /* number of valid FSSpecs in specs array */
  297.  long appIndex;  /* for indexing through the list of applications on a
  298. volume */
  299.  Boolean newSearch;
  300.  TypesBlock nativeTypes;  /* array of file types an application can open
  301. */
  302.  short typeIndex;  /* for indexing through the list of file types an
  303. application can open */
  304.  
  305.  /* No matches yet */
  306.  *count = 0;
  307.  
  308.  /* Allocate handle for matches */
  309.  *appList = (FSSpecHandle)NewHandle(0);
  310.  if ( *appList != NULL )
  311.  {
  312.   /* What file type are we trying to open */
  313.   result = FSpGetFInfo(targetDocument, &fndrInfo);
  314.   if ( result == noErr )
  315.   {
  316.    targetFileType = fndrInfo.fdType;
  317.    
  318.    /* Index through the mounted volumes */
  319.    pb.volumeParam.ioNamePtr = NULL;
  320.    volIndex = 1;
  321.    volDone = false;
  322.    while ( !volDone )
  323.    {
  324.     pb.volumeParam.ioVolIndex = volIndex;
  325.     if ( PBHGetVInfoSync(&pb) == noErr )
  326.     {
  327.      memMgrErr = noErr;
  328.      newSearch = true;
  329.      do
  330.      {
  331.       /* Find applications on this volume */
  332.       result = CreatorTypeFileSearch(NULL, pb.volumeParam.ioVRefNum,
  333.                 kIgnoreCreator, kAPPLFileType,
  334.                 specs, kMaxSpecs, &actMatchCount, newSearch);
  335.       if ( (result == noErr) || (result == eofErr) )
  336.       {
  337.        /* Look at each application found */
  338.        for ( appIndex = 0; appIndex < actMatchCount; ++appIndex )
  339.        {
  340.         /* Get this application's creator type */
  341.         if ( FSpGetFInfo(&(specs[appIndex]), &fndrInfo) == noErr )
  342.         {
  343.          /* Ask the Translation Manager what file types this application
  344. can open */
  345.          if ( GetFileTypesThatAppCanNativelyOpen(pb.volumeParam.ioVRefNum,
  346.            fndrInfo.fdCreator, (FileType *)&nativeTypes) == noErr )
  347.          {
  348.           /* Look through the FileTypes returned for the target's file
  349. type */
  350.           typeIndex = 0;
  351.           while ( nativeTypes[typeIndex] != 0 )
  352.           {
  353.            if ( nativeTypes[typeIndex] == targetFileType )
  354.            {
  355.             /* Add this application's spec to the list */
  356.             memMgrErr = PtrAndHand(&(specs[appIndex]), (Handle)*appList,
  357. sizeof(FSSpec));
  358.             ++(*count); /* Increment match count */
  359.             break; /* while ( *nativeTypePtr != 0 ) */
  360.            }
  361.            ++typeIndex; /* next file type */
  362.           }
  363.          }
  364.         }
  365.        }
  366.        newSearch = false; /* it's not a new search anymore */
  367.       }
  368.      } while ( (result == noErr) && (memMgrErr == noErr) );
  369.     
  370.      /* If there was a memory Manager error, bail out now */
  371.      if ( memMgrErr == noErr )
  372.      {
  373.       if ( result == eofErr ) /* eofErr is OK */
  374.       {
  375.        result = noErr;
  376.       }
  377.      }
  378.      else
  379.      {
  380.       result = memMgrErr;
  381.       volDone = true;
  382.      }
  383.      
  384.      ++volIndex; /* next volume */
  385.     }
  386.     else
  387.     {
  388.      volDone = true;
  389.     }
  390.    }
  391.   }
  392.   
  393.   /* Dispose of handle if errors or if no matches */
  394.   if ( (result != noErr) || (*count == 0) )
  395.   {
  396.    DisposeHandle((Handle)*appList);
  397.    *appList = NULL;
  398.    *count = 0;
  399.   }
  400.  }
  401.  else
  402.  {
  403.   result = memFullErr;
  404.  }
  405.  return ( result );
  406. }
  407.  
  408. ---------------------------
  409.  
  410. >From mjv@mit.edu (Marshall Vale) (Marshall Vale)
  411. Subject: Finding the caller of a CFM sharedlib?
  412. Date: Thu, 09 May 1996 10:58:03 -0400
  413. Organization: Massachusetts Institute of Technology
  414.  
  415. Hi,
  416.  
  417.  Is there a way to find out who the caller of a CFM shared library is? From
  418. reading through IM and a few other sources, there doesn't seem to be a
  419. good public way of doing. The purpose of this is to be able to do some
  420. tracking on a product that we don't have the source to, we're writing the
  421. dll. If the solution isn't clean, that's ok.
  422.  
  423. TIA,
  424. Marshall
  425.  
  426. Marshall Vale |   mjv@mit.edu  | "Das Schicksal des Mannes ist knusprig
  427. MacDevGuy, IS | Massachusetts Institute of Technology |    und lecker."
  428.  
  429. ---------------------------
  430.  
  431. >From Robert van Uitert <robt@euronet.nl>
  432. Subject: If you don't want to *wait* for events...
  433. Date: 18 May 1996 00:29:37 GMT
  434. Organization: Three-Space Interactive
  435.  
  436. /*
  437. Hi everyone,
  438.  
  439. There seems to be some confusion about the slowness of getting events,
  440. the overhead of the Mac OS, having to quit the Finder for better
  441. performance, etc. I hope I can clear up some things.
  442.  
  443. Below you will find the C++ code for a little program that tests the
  444. speed of the various event-retrieval methods (WaitNextEvent, etc.).
  445. Just compile and run it. You may learn something! I did! ;-)
  446.  
  447. Before you compile it, you should set the kCyclesPerSec constant (in
  448. the first line of code) to your machine's clock speed.
  449.  
  450. After running this program, you should note the following:
  451. - WaitNextEvent, GetNextEvent and EventAvail are faster when there's
  452. an updateEvt pending. I assume background apps are not given any time
  453. until the front app has handled all update events.
  454. - GetOSEvent is a *lot* faster than WNE/GNE. It's very uncooperative
  455. by not giving any time to background processes, but that's just fine
  456. for a game that takes over the screen/system. If low-level events
  457. (i.e. all events other than update, activate, suspend/resume, mouse-
  458. moved and high-level events) are all you need, then use GetOSEvent and
  459. do *not* use WNE/GNE.
  460. - GetOSEvent is slower (on my 6100/66 at least) than GetKeys, but if
  461. you also need the state of the mouse button, GetOSEvent is faster than
  462. GetKeys and Button combined.
  463.  
  464. The fastest way of processing low-level events is to first check
  465. whether there's one available by looking at the qHead (or qTail) field
  466. of the event queue header (which you can get from GetEvQHdr,
  467. GetEventQueue or LMGetEventQueue), and then (if necessary) call either
  468. GetOSEvent or the low-level Dequeue function, as follows:
  469.  
  470.     if ((elem = (EvQElPtr)queue->qHead) != nil) {
  471.         switch (elem->evtQWhat) {
  472.         ...
  473.         }
  474.         Dequeue((QElemPtr)elem, queue);
  475.     }
  476.  
  477. The Dequeue function apparently also adds new events to the queue.
  478. This is pretty much undocumented, however, and for the sake of
  479. compatibility I wouldn't use this method in any commercial product.
  480. The following works just as well (or better):
  481.  
  482.     if (queue->qHead) {
  483.         GetOSEvent(everyEvent, &event);
  484.         switch (event.what) {
  485.         ...
  486.         }
  487.     }
  488.  
  489. Of course, the above won't do the job if you want null events too
  490. (e.g. to read the up-to-date state of the modifier keys); in that
  491. case, just call GetOSEvent without testing queue->qHead.
  492.  
  493. Happy happy, joy joy,
  494.  
  495. De ballen,
  496.  
  497. Robt.
  498. */
  499.  
  500.  
  501. #define kCyclesPerSec 66000000 // For a 66 MHz CPU
  502. #define reg register
  503. #define Ticks (*(long *)0x16A)
  504.  
  505. static long lengthOfCStr(reg char *s)
  506. {
  507.     reg char *p = s - 1;
  508.     while (*++p)
  509.         ;
  510.     return p - s;
  511. }
  512.  
  513. void main()
  514. {
  515. #define TEST(code)\
  516.     n = 0;\
  517.     t = Ticks + 60;\
  518.     do {\
  519.         code\
  520.         ++n;\
  521.     } while (Ticks < t);\
  522.     \
  523.     MoveTo(50, qd.thePort->pnLoc.v + 20);\
  524.     DrawText(#code, 0, lengthOfCStr(#code));\
  525.     MoveTo(400, qd.thePort->pnLoc.v);\
  526.     NumToString(n, s);\
  527.     DrawString(s);\
  528.     MoveTo(500, qd.thePort->pnLoc.v);\
  529.     NumToString(kCyclesPerSec / n, s);\
  530.     DrawString(s);
  531.  
  532.     MaxApplZone();
  533.     InitGraf(&qd.thePort);
  534.     InitFonts();
  535.     InitWindows();
  536.  
  537.     SetPort(NewWindow(nil, &qd.screenBits.bounds, "\p", true, 
  538.             dBoxProc, (WindowPtr)-1, false, 0));
  539.     TextFont(monaco);
  540.  
  541.     EventRecord event;
  542.     KeyMap keyMap;
  543.     Str255 s;
  544.     reg long n, t;
  545.     reg QHdrPtr queue = GetEventQueue();
  546.  
  547.     for (n = 0; n < 10; ++n)
  548.         WaitNextEvent(everyEvent, &event, 1, nil);
  549.  
  550.     MoveTo(365, 40);
  551.     DrawString("\piterations/sec");
  552.     MoveTo(500, 40);
  553.     DrawString("\pcycles/iteration");
  554.  
  555.     MoveTo(50, 70);
  556.     DrawString("\pWith a pending updateEvt:");
  557.     TEST(  WaitNextEvent(everyEvent, &event, 0, nil);  )
  558.     TEST(  GetNextEvent(everyEvent, &event);  )
  559.     TEST(  EventAvail(everyEvent, &event);  )
  560.  
  561.     for (n = 0; n < 10; ++n) {
  562.         WaitNextEvent(everyEvent, &event, 1, nil);
  563.         if (event.what == updateEvt) {
  564.             BeginUpdate((WindowPtr)event.message);
  565.             EndUpdate((WindowPtr)event.message);
  566.         }
  567.     }
  568.     MoveTo(50, qd.thePort->pnLoc.v + 30);
  569.     DrawString("\pAfter the updateEvt is handled:");
  570.     TEST(  WaitNextEvent(everyEvent, &event, 0, nil);  )
  571.     TEST(  GetNextEvent(everyEvent, &event);  )
  572.     TEST(  EventAvail(everyEvent, &event);  )
  573.  
  574.     Move(0, 10);
  575.     TEST(  GetOSEvent(everyEvent, &event);  )
  576.     TEST(  OSEventAvail(everyEvent, &event);  )
  577.     TEST(  if (queue->qHead) GetOSEvent(everyEvent, &event);  )
  578.  
  579.     Move(0, 10);
  580.     TEST(  GetKeys(keyMap);  )
  581.     TEST(  Button();  )
  582.  
  583.     MoveTo(50, qd.thePort->pnLoc.v + 30);
  584.     DrawString("\pTimer overhead:");
  585.     TEST(  ;  )
  586.  
  587.     MoveTo(50, qd.thePort->pnLoc.v + 40);
  588.     DrawString("\pPress the mouse button to quit");
  589.     while (!Button())
  590.         ;
  591.     FlushEvents(everyEvent, 0);
  592. }
  593.  
  594. +++++++++++++++++++++++++++
  595.  
  596. >From Andrew Edward White <andreww>
  597. Date: 20 May 1996 03:03:08 GMT
  598. Organization: School of CompSci & Eng, Uni Of NSW, Oz
  599.  
  600. In article <319D1A1A.49D6@euronet.nl> Robert van Uitert <robt@euronet.nl> writes:
  601. >
  602. >After running this program, you should note the following:
  603. >- WaitNextEvent, GetNextEvent and EventAvail are faster when there's
  604. >an updateEvt pending. I assume background apps are not given any time
  605. >until the front app has handled all update events.
  606.  
  607. Yes.  Not handling update events is a great way to lock up your
  608. communications software (or other time critical background processes).
  609.  
  610. --
  611. Andrew White
  612. andreww@cse.unsw.edu.au
  613. http://www.cse.unsw.edu.au/~andreww/
  614. "A complex problem is merely a simple hierarchy of simple problems"
  615.  
  616. ---------------------------
  617.  
  618. >From pdinda@cs.cmu.edu (Peter A. Dinda)
  619. Subject: MacFS: A Portable Macintosh Filesystem
  620. Date: Thu, 09 May 1996 14:41:12 GMT
  621. Organization: Carnegie Mellon University SCS
  622.  
  623.  
  624. MacFS: A Portable Macintosh Filesystem
  625.  
  626. Copyright (c) 1996 by Peter A. Dinda, George C. Necula, and Morgan Price 
  627.  
  628. Many moons ago, George C. Necula, Morgan Price, and I built a Macintosh
  629. Heirachical File System implementation with an eye towards portability.  For a
  630. variety of reasons, mostly time constraints and because none of our respective
  631. research areas encompasses filesystem design and implementation, MacFS has been
  632. sitting on a shelf until now.  We have decided to dust it off and make it
  633. available to the net.  We hope that some young hackers with more time on their
  634. hands than we have will port it to Linux, FreeBSD, NetBSD, OS/2, NT, etc. 
  635.  
  636. MacFS is a complete (read/write) filesystem library which can be used to build
  637. user-level and kernel-level support for Macintosh volumes.  Included in the
  638. distribution are user-level utilities (ls/cp/etc), as well as a very alpha Mach
  639. vfs (ie, vnode) built on top of the library.  The code has been tested on
  640. PMAX/Mach 3.0 machines and Intel/NetBSD machines.  
  641.  
  642. The source code for MacFS 0.1 and a technical report describing MacFS are
  643. available via the "Programs" icon on the web page: 
  644.  
  645.    http://www.cs.cmu.edu/afs/cs.cmu.edu/usr/pdinda/html/pdinda.html
  646.  
  647. The source code is also available by ftp via:
  648.  
  649.                 ftp://ftp.cs.cmu.edu/user/pdinda/
  650.      
  651. Please read the (very liberal) license agreement available in each of these
  652. locations.  Let us know if this code is useful to you.  Included below is the
  653. abstract for the tech report:
  654.  
  655.  
  656. We have created a Macintosh file system library which is portable to a
  657. variety of operating systems and platforms.  It presents a programming
  658. interface sufficient for creating a user level API as well as file
  659. system drivers for operating systems that support them.  We
  660. implemented and tested such a user level API and utility programs
  661. based on it as well as an experimental Unix Virtual File System.  
  662.  
  663. We describe the Macintosh Hierarchical File System and our
  664. implementation and note that the design is not well suited to
  665. reentrancy and that its complex data structures can lead to slow
  666. implementations in multiprogrammed environments.  Performance
  667. measurements show that our implementation is faster than the native
  668. Macintosh implementation at creating, deleting, reading and writing
  669. files with small request sizes, but slower than the Berkeley Fast File
  670. System (FFS.)  However, the native Macintosh implementation can
  671. perform large read and write operations faster that either our
  672. implementation or FFS.
  673.  
  674.  
  675.  
  676. Peter August Dinda                                     pdinda@cs.cmu.edu
  677. Doctoral Student, School of Computer Science, Carnegie Mellon University
  678.    http://www.cs.cmu.edu/afs/cs.cmu.edu/usr/pdinda/html/pdinda.html
  679.  
  680. Peter August Dinda                                     pdinda@cs.cmu.edu
  681. Doctoral Student, School of Computer Science, Carnegie Mellon University
  682.    http://www.cs.cmu.edu/afs/cs.cmu.edu/usr/pdinda/html/pdinda.html
  683.  
  684.  
  685. ---------------------------
  686.  
  687. >From plang@com.mcnet.ch (Philippe Lang)
  688. Subject: Serial port in use?
  689. Date: Thu, 02 May 1996 16:12:39 +0200
  690. Organization: EPFL
  691.  
  692. How can I know if a serial port is already in use, before opening it? I
  693. thought this would be an easy job, but I haven't succeeded. The piece of
  694. code I found in the developer CD does not work, and the device manager
  695. OpenDriver routine does not return "portInUse".
  696.  
  697. I'm using system software 7.5.3.
  698.  
  699. Thanks
  700.  
  701. -- 
  702. Philippe Lang
  703. SWITZERLAND
  704.  
  705. +++++++++++++++++++++++++++
  706.  
  707. >From sbower@teleport.com (Steve Bower)
  708. Date: 3 May 1996 23:56:53 GMT
  709. Organization: Teleport - Portland's Public Access (503) 220-1016
  710.  
  711. "portInUse" is a low-level (in PRAM) state flag that tells the OS when
  712. certain kinds of drivers are active and may be using the serial hardware
  713. ports.  E.G. AppleTalk, Serial, or None.  Is this really the information
  714. you want?  Or are you trying to use the serial driver and want know if
  715. another application is already using it?
  716.  
  717. If the latter, the short answer is -- you can't find out unless you are
  718. using the Communications Toolbox.  Apple didn't provide any mechanism for
  719. arbitrating hardware ports when they designed the Mac OS.  The CTB was an
  720. attempt to rectify that problem -- with mixed results.
  721.  
  722. -Steve
  723.  
  724.  
  725. In article <plang-0205961612390001@phlang.dial.mcnet.ch>,
  726. plang@com.mcnet.ch (Philippe Lang) wrote:
  727.  
  728. > How can I know if a serial port is already in use, before opening it? I
  729. > thought this would be an easy job, but I haven't succeeded. The piece of
  730. > code I found in the developer CD does not work, and the device manager
  731. > OpenDriver routine does not return "portInUse".
  732. > I'm using system software 7.5.3.
  733. > Thanks
  734. > -- 
  735. > Philippe Lang
  736. > SWITZERLAND
  737.  
  738. -- 
  739. -Steve                                         sbower@teleport.com
  740.  
  741. +++++++++++++++++++++++++++
  742.  
  743. >From plang@com.mcnet.ch (Philippe Lang)
  744. Date: Sun, 05 May 1996 22:17:42 +0200
  745. Organization: EPFL
  746.  
  747. In article <sbower-0305961657320001@ip-pdx03-43.teleport.com>,
  748. sbower@teleport.com (Steve Bower) wrote:
  749.  
  750. > "portInUse" is a low-level (in PRAM) state flag that tells the OS when
  751. > certain kinds of drivers are active and may be using the serial hardware
  752. > ports.  E.G. AppleTalk, Serial, or None.  Is this really the information
  753. > you want?  Or are you trying to use the serial driver and want know if
  754. > another application is already using it?
  755. > If the latter, the short answer is -- you can't find out unless you are
  756. > using the Communications Toolbox.  Apple didn't provide any mechanism for
  757. > arbitrating hardware ports when they designed the Mac OS.  The CTB was an
  758. > attempt to rectify that problem -- with mixed results.
  759.  
  760. Thanks Steve,
  761.  
  762. Yes, I want to know if another application is already using a serial
  763. port... There is really no solution? Gosh. Is it possible to know the
  764. state of a serial port with the help of the Comm Toolbox, even if I'm not
  765. using the Comm Toolbox for sending data? I suppose no...
  766.  
  767. -- 
  768. Philippe Lang
  769. SWITZERLAND
  770.  
  771. +++++++++++++++++++++++++++
  772.  
  773. >From cswan@actrix.gen.nz (Christopher Swan)
  774. Date: Thu, 09 May 1996 20:45:20 +1200
  775. Organization: Raine Storm Softworks
  776.  
  777. >Yes, I want to know if another application is already using a serial
  778. >port... There is really no solution? Gosh. Is it possible to know the
  779. >state of a serial port with the help of the Comm Toolbox, even if I'm not
  780. >using the Comm Toolbox for sending data? I suppose no...
  781.  
  782. In theory you can use the 'serial port arbitrator' that comes with ARA -
  783. but its never worked for me. The CTB does not really arbitrate serial
  784. ports (contrary to popular belief - although it does provide a
  785. 'IsDriverOpen' function) so the best solution is to 'walk' the driver
  786. entry table and find the driver you want to open and see if it is already
  787. open.
  788.  
  789. -- 
  790.  
  791. Cheers, Chris
  792.  
  793. - ---------------------------------------------------------------------
  794. Christopher Swan                                 CompuServe 100354,3427   
  795. PO Box 11567, Wellington, New Zealand                 or Raine@kagi.com
  796. - ---------------------------------------------------------------------
  797.  
  798. +++++++++++++++++++++++++++
  799.  
  800. >From harun@village.village.de (Harun Scheutzow)
  801. Date: Thu, 9 May 1996 08:29:58 GMT
  802. Organization: Village Tronic Marketing GmbH
  803.  
  804. You may look into the UTable and find the DCE (Device Control Entry).
  805. In the DCE there you find the information whether the driver is opened
  806. or closed. See IM Devices. Not very clean, but a possible solution for
  807. your problem.
  808.  
  809. Regards, HS
  810. <Opinions are my own>
  811.  
  812.  
  813. +++++++++++++++++++++++++++
  814.  
  815. >From sw@nan.co.uk (Sak Wathanasin)
  816. Date: Thu, 9 May 1996 21:37:53 GMT
  817. Organization: Network Analysis Ltd
  818.  
  819. In article <plang-0205961612390001@phlang.dial.mcnet.ch>,
  820. plang@com.mcnet.ch (Philippe Lang) wrote:
  821.  
  822. > How can I know if a serial port is already in use, before opening it? I
  823. > thought this would be an easy job, but I haven't succeeded. The piece of
  824. > code I found in the developer CD does not work, and the device manager
  825. > OpenDriver routine does not return "portInUse".
  826.  
  827. It does if you have ARA installed. If it isn't, you are supposed to walk
  828. the device unit table, find the driver entry and
  829.  
  830. "look at bit 5 of the low-order byte of the dCtlFlags field of the Serial
  831. Driver’s DCE"
  832.  
  833. according to tech note DV555 - Serial driver Q & A. The ARA API manual says
  834.  
  835. "When installed Remote Access provides serial port arbitration throught
  836. [sic!] the Serial Port Arbitrator tool.   All serial drivers registered
  837. with the Communications Resource Manager are arbitrated by the Serial Port
  838. Arbitrator.   
  839.  
  840. To check to see if the Serial Port Arbitrator is installed, check the
  841. gestaltSerialArbitrationExists flag of the gestaltArbitorAttr Gestalt
  842. selector  (see "Gestalts" section for these defines and an example of this
  843. call).
  844.  
  845. If serial port arbitration is present, call OpenDriver when you want to
  846. use a serial port.  If the driver requested is not open, OpenDriver will
  847. return a result of noErr and the reference number of the driver.  If the
  848. driver requested is open (in use), OpenDriver will return the error
  849. portInUse.  When you are finished using the driver, call CloseDriver. 
  850. OpenDriver and CloseDriver calls should always be balanced,  although the
  851. Serial Port Arbitrator will protect against multiple open/close calls.
  852.  
  853. If serial port arbitration is not present, do not use OpenDriver to
  854. determine if the driver is open.  It will return you a result of noErr and
  855. the reference number, allowing you access to a driver that another
  856. application is using.   To determine if the serial driver requested is
  857. open by another application, you must walk the DCE (Device Control Entry)
  858. unit table (see Device Driver chapter of Inside Macintosh vol II)."
  859.  
  860. The ARA API guide has sample code on how to do this (with or without ARA
  861. present), but I'm not sure if one is allowed to post it here (it's Apple's
  862. copyright, so I'll leave it to someone from Apple to post it). The ARA SDK
  863. is on the MacOS SDK CD which you can get from APDA.
  864.  
  865. -- 
  866. Sak Wathanasin
  867. Network Analysis Limited
  868. 178 Wainbody Ave South, Coventry CV3 6BX, UK
  869.  
  870. Internet: sw@nan.co.uk 
  871. uucp:     ...!britain.eu.net!nan!sw
  872. Phone: (+44) 1203 419996                              Fax: (+44) 1203 690690
  873.  
  874. ---------------------------
  875.  
  876. >From IMPROVISION@applelink.apple.com (Graham)
  877. Subject: Tiny Object Framework anyone?
  878. Date: Thu, 16 May 1996 17:00:05 GMT
  879. Organization: (none)
  880.  
  881.  
  882. I have written a tiny object framework for writing mac app's in C++
  883. using CodeWarrior 8.0, mainly to teach my girlfriend OOP programming
  884. with a gentler learning curve than, say PowerPlant. You can knock up
  885. mac apps in minutes with it. (Four basic classes, plus one or two
  886. others).
  887.  
  888. If anyone thinks this would be of use to them, I will release it as
  889. freeware, if the demand exists, so eMail me back, or simply repost your
  890. response.
  891.  
  892. I would post it immedsiately, but all in it runs to about a meg of
  893. sources, etc., so I will spare the bandwidth for now.
  894.  
  895. --Graham.
  896.  
  897.  
  898. ---------------------------
  899.  
  900. >From crawford@scipp.ucsc.edu (Mike Crawford)
  901. Subject: Web page for Macsbug tips
  902. Date: 7 May 1996 21:46:25 GMT
  903. Organization: UC Santa Cruz - SCIPP
  904.  
  905. I am working on a Web page for Macsbug tips and tricks.  It's been
  906. around for a while with not much content.  It still doesn't say
  907. much, but it does now answer the two most frequent questions I
  908. get from its readers:
  909.  
  910. Where do I get Macsbug?
  911.  
  912. Are there books about Macsbug?
  913.  
  914. I brought this up a while back and many of you sent me your
  915. tricks and tips.  I filed them away until I could get around to
  916. adding them.  If you have a tip you'd like to submit to the
  917. page, or if you have a Macsbug or debugging web page that you'd
  918. like me to link to, please mail me at crawford@scruznet.com
  919.  
  920. To visit the page, see:
  921.  
  922. http://www.scruznet.com/~crawford/Computers/macsbug.html
  923.  
  924. Best,
  925. -- 
  926. Mike Crawford                      | Free Mac source code.  The Word Services
  927. crawford@scruznet.com              | allows you to link to a speller or other
  928. crawford@maxwell.ucsc.edu          | text service.  See the W.S. home page at:
  929. http://www.scruznet.com/~crawford/WordServices/wdsvindex.html
  930.  
  931.  
  932. ---------------------------
  933.  
  934. >From "Jim Cavera" <jim_cavera@bogie2.bio.purdue.edu>
  935. Subject: [SOURCE] MicroMovie (was: HELP! with QuickTime)
  936. Date: 6 May 96 13:57:33 -0500
  937. Organization: Purdue University
  938.  
  939. Due to overwhelming demand, I'm posting the source to a tiny QuickTime
  940. app on my ftp-site.  MicroMovie reads a series of PICTs from its resource
  941. fork and makes them into a QuickTime movie.  It's small.  It's simple.
  942. It's easily adaptable to other stuff (animation, converting PICS files,
  943. etc.).
  944. It's pretty well commented.  It's not very pretty and it may be a bit
  945. buggy (geez, whad' you exepect?  It took me all of a half hour).  You
  946. can find it at :
  947.  
  948. ftp://ibcrc5.bio.purdue.edu/FTP/Public/MicroMovie68K.sit.hqx
  949.  
  950. If you have any problems getting it, feel free to drop me an e-line
  951. and I'll try to mail you a copy.
  952.  
  953. Jim Cavera (bit-pushing slave)
  954. jim_cavera@bogie2.bio.purdue.edu
  955.  
  956. P.S.:  All of the MicroMovie stuff is in the public domain.  If,
  957. however, you use it as the basis of a killer app and make a zillion
  958. dollars off it, I would appriciate some recognition ;-)
  959.  
  960. P.P.S.:  Also, you may want to check out the Tools Plus 3.0 eval
  961. kit at the same site.  If you program a lot and have stupid people
  962. given rediculous deadlines, it will REALLY make your life
  963. easier.
  964.  
  965.  
  966. ---------------------------
  967.  
  968. End of C.S.M.P. Digest
  969. **********************
  970.  
  971.  
  972.  
  973.